package collection;

/**
 * 自定义一个hashmap
 */
public class MyCollection_HashMap<K,V> {
    HashNode[] table;  //位桶   核心数组
    int size;   //存放键值对的个数

    public MyCollection_HashMap() {
        table = new HashNode[16]; //长度一般定义成2的整数次幂
    }

    public void put(K key,V value){
        //定义新的节点对象
        HashNode hashNode = new HashNode();
        hashNode.hash = MyHash(key.hashCode(),table.length);
        hashNode.key=key;
        hashNode.value=value;
        hashNode.next=null;

        HashNode temp = table[hashNode.hash];

        HashNode iterLast = null;//正在遍历的最后一个元素
        Boolean keyRepeat = false;

        if(temp==null){
            //此处数组为空，则直接将新节点放进去
            table[hashNode.hash]=hashNode;
            size++;
        }else{
            //次数组不为空，则遍历对应列表
            while (temp!=null){
                //key如果重复，则覆盖
                if (temp.key.equals(key)){
                    System.out.println("重复了");
                    temp.value=value;
                    keyRepeat =true;
                    break;
                }else{
                    //key如果不重复，则遍历下一个
                    iterLast = temp;
                    temp = temp.next;
                }
            }
            if (!keyRepeat){
                //把新节点插入最后一个
                iterLast.next=hashNode;
                size++;
            }
            keyRepeat = false;
        }
    }

    public V get(K key){
        int hash = MyHash(key.hashCode(),table.length);
        V value = null;

        if(table[hash]!=null){
            HashNode temp = table[hash];
            while (temp!=null){
                if(temp.key.equals(key)){//如果相等，就取value
                    value = (V)temp.value;
                    break;
                }else {
                    temp = temp.next;
                }
            }
        }

        return value;
    }

    public int MyHash(int v,int length){
        return v&(length-1);
    }

    @Override
    public String toString() {
        //{10:aa,20:bb}
        StringBuilder sb = new StringBuilder("{");
        for(int i=0;i<table.length;i++){
            HashNode temp = table[i];
            while (temp!=null){
                sb.append(temp.key+":"+temp.value+",");
                temp = temp.next;
            }
        }
        sb.setCharAt(sb.length()-1,'}');
        return sb.toString();
    }

    public static void main(String[] args) {
        MyCollection_HashMap<Integer,String> m = new MyCollection_HashMap<>();

        m.put(10,"aaa");
        System.out.println(m);
        System.out.println(m.get(10));
    }
}

class HashNode<K,V>{
    int hash;
    K key;
    V value;
    HashNode next;
}